﻿using BUGCOME.Model.Auth;
using BUGCOME.Model.Auth.dto;
using BUGCOME.ServiceCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BUGCOME.ServiceCore.Services.IServices
{
    /// <summary>
    /// 菜单管理服务接口，定义菜单相关业务操作契约
    /// 继承自IBaseService泛型接口，包含菜单实体的基础CRUD操作
    /// </summary>
    /// <remarks>
    /// 实现类需提供菜单树构建、权限关联、菜单过滤等扩展功能
    /// 适用于后台管理系统的菜单权限管理场景
    /// </remarks>
    public interface IMenuService : IBaseService<Menu>
    {
        /// <summary>
        /// 添加菜单
        /// </summary>
        /// <param name="menu"></param>
        /// <returns></returns>
        Task<long> AddMenuAsync(Menu menu);

        /// <summary>将菜单列表构建为路由视图对象列表</summary>
        /// <param name="menus">菜单列表</param>
        /// <returns>路由视图对象列表</returns>
        List<RouterVo> BuildMenus(List<Menu> menus);

        /// <summary>
        /// 异步检查菜单名称唯一性
        /// </summary>
        /// <param name="menu">
        /// 待检查的菜单
        /// </param>
        /// <returns>空表示唯一，否则为不唯一提示</returns>
        Task<string> CheckMenuNameUniqueAsync(Menu menu);

        /// <summary>
        /// 根据关联ID删除所有相关菜单关联记录
        /// </summary>
        /// <param name="menuId">关联ID（通常为角色ID）</param>
        /// <returns>异步任务，返回被删除的记录数量</returns>
        Task<long> DeleteAllMenuByIdAsync(long menuId);

        /// <summary>
        /// 根据菜单ID删除特定菜单的关联记录
        /// </summary>
        /// <param name="menuId">菜单ID</param>
        /// <returns>异步任务，返回被删除的记录数量</returns>
        Task<long> DeleteMenuByIdAsync(long menuId);

        // <summary>
        // 异步编辑菜单
        // </summary>
        /// <param name="menu">菜单实体对象（包含编辑信息）</param>
        /// <returns>包含受影响行数（或编辑后菜单ID）的异步任务</returns>
        Task<long> EditMenuAsync(Menu menu);

        /// <summary>根据菜单ID异步获取菜单详细信息</summary>
        /// <param name="value">菜单ID</param>
        /// <returns>包含菜单详细信息的异步任务</returns>
        Task<Menu> GetMenuByMenuIdAsync(long value);

        /// <summary>
        /// 异步检查指定菜单 ID 是否存在子项
        /// </summary>
        /// <param name="menuId">菜单 ID，用于查询是否存在子项</param>
        /// <returns>其结果为 true 表示指定菜单 ID 存在子项，false 表示不存在</returns>
        Task<bool> HasChildByMenuIdAsync(long menuId);

        //// <summary>
        /// 异步查询指定用户ID拥有的菜单权限标识集合
        /// </summary>
        /// <param name="userId">用户唯一标识</param>
        /// <returns>
        /// 返回包含权限标识字符串的异步任务
        /// 若用户无任何权限或不存在，返回空集合而非null
        /// </returns>
        /// <remarks>
        /// 权限标识通常为"模块:操作"格式（如"admin:user:add"）
        /// 结果已自动去重，且按系统预设顺序排列
        /// </remarks>
        Task<IEnumerable<string>> SelectMenuPermsByUserIdAsync(long userId);

        /// <summary>
        /// 根据用户 ID 获取菜单树（异步）
        /// </summary>
        /// <param name="uid">用户 ID</param>
        /// <returns>菜单树列表任务</returns>
        Task<List<Menu>> SelectMenuTreeByUserIdAsync(long uid);


        // <summary>根据查询条件和用户ID异步查询树形菜单列表</summary>
        /// <param name="menu">菜单查询条件DTO</param>
        /// <param name="userId">用户ID</param>
        /// <returns>树形菜单列表的异步任务</returns>
        Task<List<Menu>> SelectTreeMenuListAsync(MenuQueryDto menu, long userId);
    }
}
